package com.openess.bigsearch.engine.analyzer;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

import com.openess.bigsearch.engine.index.Token;
import com.openess.bigsearch.engine.utils.LinkedList;

public class SignAnalyzer implements Analyzer {
	// 停用词列表，忽略大小写
	public static final String[] stopTerm = { "a", "an", "and", "or", "as",
			"for", "the", "that", "those", "over", "under", "above", "below" };

	@Override
	public Token<String, Integer>[] parse(int offset, String str) {
		return split(str, "", offset);
	}

	/**
	 * 按指定格式划分字段，如果不是space,comma,euqal中的一种，那么默认使用/W即以一切非词语字符进行切分，模仿Pattern.split
	 * (String)实现，但有所改进，将空串全部过滤掉，在运行过程中计算每个分词的起始字符位置。
	 * 
	 * @param str
	 *            待处理的字符串
	 * @param type
	 *            两种类型:space, comma, equal
	 * @param offset
	 *            给所有字符都增加的偏移量
	 * @return 返回(term, offset)对，offset代表字符位置(以字符为单位)
	 */
	private Token<String, Integer>[] split(final String str, final String type,
			int offset) {
		if (str == null) {
			return null;
		}
		// 不过滤头尾空格，全部小写化，过滤头尾空格有问题，可能造成偏移位置错位
		String input = str.toLowerCase();
		String regex = null;
		if (type.trim().equalsIgnoreCase("space")) {
			regex = "\\s+";
		} else if (type.trim().equalsIgnoreCase("comma")) {
			regex = ",";
		} else if (type.trim().equalsIgnoreCase("equal")) {
			regex = "=";
		} else {
			regex = "\\W+";
		}
		Pattern pattern = Pattern.compile(regex);
		Matcher m = pattern.matcher(input);
		// 集合用于装载分割后的子串即每个子串的起始位置
		LinkedList<Token<String, Integer>> list = new LinkedList<Token<String, Integer>>();
		// 待分割子串的起始位置
		int index = 0;
		// 循环分割
		while (m.find()) {
			// 分割
			String match = input.substring(index, m.start());
			// 分割出空串不放入集合，属于停用词不放入集合
			if (match.length() != 0 && !isStop(match)) {
				list.add(new Token<String, Integer>(match, index + offset));
			}
			index = m.end();
		}
		// 保存最后一段分割子串
		String match = input.substring(index, input.length());
		if (match.length() != 0) {
			list.add(new Token<String, Integer>(match, index + offset));
		}
		// 将结合转换为数组返回
		return list.toArray(new Token<String, Integer>());
	}

	/**
	 * 停用词过滤，如果参数属于停用词的一种，那么返回true，否则返回false
	 * 
	 * @param str
	 * @return
	 */
	private boolean isStop(String str) {
		for (String stop : stopTerm) {
			if (stop.equalsIgnoreCase(str)) {
				return true;
			}
		}
		return false;
	}
}
